Amazon RedshiftでAmazon Machine LearningのDatasourceを作ってみた
RDS for MySQLとAuroraからAmazon Machine Learning(Amazon ML)のDatasourceを作成してきましたが、最後にRedshiftからの手順について試してみました。公式ドキュメントのUsing Amazon Redshift with Amazon MLに書かれている手順です。Redshiftに関してはマネジメントコンソールからDatasourceを作成可能なため、今回はマネジメントコンソールを利用して作成しています。
仕組み
RedshiftからDatasourceを作成する場合は、Redshiftのunloadコマンドを利用する仕組みになっています。Amazon MLの CreateDataSourceFromRedshift APIを実行すると、Amazon MLサービスが以下の処理を実行します。
- Amazon MLサービスがRedshiftにunloadコマンドを発行し、結果がS3にCSVファイルとして保存される
- Amazon MLサービスがS3上のCSVファイルをDatasourceとして読み込む
そのため、事前に以下の準備が必要になります。
- S3バケットの作成
- Amazon ML用のIAM Roleの作成
なお、DatasourceのData Schemaについての準備は任意です1。マネジメントコンソールから作成する場合は後述しているようにAmazon ML側がRedshiftにクエリを発行して、その結果から自動でData Schemaの雛形を作成してくれます。API経由の場合は編集するタイミングがないためData SchemaのJSONを指定が必須となります。
前提
まずは今回の手順の前提の確認です。Redshiftは作成済みで、testdbにbankingテーブルが存在している前提です。bankingテーブルはAmazon MLのチュートリアルに載っているbanking.csvに対応しています。また、リージョンはAmazon MLが利用可能なバージニアを利用しています。
項目 | 値 |
---|---|
リージョン | バージニア(us-east-1) |
RedshiftのInstanceIdentifier | test-redshift |
Redshiftのデータベース | testdb |
Redshiftのテーブル | banking |
bankingテーブルのDDLは以下の通りです。とりあえず動作すれば良いという割り切りで作っています。
CREATE TABLE banking ( age INT, job VARCHAR(20), marital VARCHAR(20), education VARCHAR(20), defalut VARCHAR(20), housing VARCHAR(20), loan VARCHAR(20), contact VARCHAR(20), month VARCHAR(20), day_of_week VARCHAR(20), duration INT, campaign INT, pdays INT, previous INT, poutcome VARCHAR(20), emp_var_rate FLOAT, cons_price_idx FLOAT, cons_conf_idx FLOAT, euribor3m FLOAT, nr_employed FLOAT, y INT );
banking.csvをbankingテーブルにインポートする際はCOPYコマンドなどが利用できます。
COPY banking FROM 's3://YOUR_BUCKET_NAME/banking.csv' CREDENTIALS 'aws_access_key_id=****;aws_secret_access_key=****' CSV IGNOREHEADER AS 1;
Amazon ML用のIAM Roleの作成
2016-03-21のアップデートでAmazon MLコンソール上でIAMロールを作成できるようになりました。詳細はAmazon Machine Learningコンソール上でAmazon Redshiftへ接続するためのIAMロールを作成できるようになりました | Developers.IOをご参照ください。
Redshiftの場合もAmazon MLサービスにRedshiftとAmazon MLの操作を行ってもらう形になるためAmazon MLサービスがAssumeRole可能なIAM Roleを作成する必要があります2。具体的には公式ドキュメントのAmazon ML Amazon Redshift IAM roleに書かれている手順になります3。
以下の留意事項に沿ってマネジメントコンソール上でIAM Roleを作成して下さい。
- APIを呼び出すときはRoleのARNを利用するため[Role Name]は任意です。例えばAmazon_ML_Redshiftなどとします。
- [Select Role Type]ではAmazon Machine Learning Role for Redshift Data Sourceを指定します。
- [Attach Policy]の画面でAmazonMachineLearningRoleforRedshiftDataSourceへチェックを入れます。
マネジメントコンソール上でDatasourceの作成
事前準備は完了したので、マネジメントコンソール上でDatasourceを作成したいと思います。
Amazon MLサービスの画面を開き[Create new...]のプルダウンから[Datasource]をクリックします。そうするとDatasourceの作成画面が表示されるので、[Where is your data located?]の箇所で[Redshift]をクリックします。後は個々のフィールドに値を入力して[Verify]ボタンをクリックして下さい。入力フィールドに関する補足事項は以下の通りです。
- Amazon ML Redshift roleには先程作成したIAM RoleのARNを指定して下さい。
- Redshift cluster IDはRedshiftの[Cluster Identifier(Cluster Name)]を指定します。
- Redshift SQL queryにはデータ抽出用のSQLを記述します。なお、最後にセミコロンを付けないとエラーとなりますので注意して下さい。また、ORDER BY random()はRDS for MySQLの場合と同様に学習精度を向上するためです。
[Verify]ボタンを実行するとAmazon MLからRedshiftに対して実際にクエリが発行されます。Redshiftのクエリログを確認した所、LIMIT 500を付けて発行するようです。クエリの発行に成功すると[Verify]ボタンが[Continue]ボタンに変わるのでクリックします。
後はS3からDatasourceを作成する流れと変わりません。[Schema]の設定画面が表示されるので、設定を行います。
最後まで進めると以下の様な[Review]画面になりました。[Finish]ボタンをクリックするとRedshiftにクエリが発行され、S3に結果がunloadされ、そのCSVファイルを用いてAmazon MLがDatasourceを作成します。
最後におまけとしてRedshiftのクエリログの画面を貼っておきます。まずLIMIT 500でクエリを発行し、最後にUNLOADのクエリを発行していることが分かります。
まとめ
いかがだったでしょうか。RDS for MySQLの場合と比べるとRedshiftの場合はマネジメントコンソール上でスキーマの設定が行えるのは便利ですね!IAM Roleの設定も予めテンプレートが用意されているので簡単に設定できます。すでにRedshiftクラスタをお持ちの方はぜひ一度お試しいただければと思います。
- Data Schemaの詳細はAmazon Machine Learningで自動生成されたData Schema JSONを確認するをご参照下さい。 ↩
- AssumeRoleの詳細はIAMロール徹底理解 〜 AssumeRoleの正体をご参照下さい。 ↩
- 公式ドキュメントの最初にSecurity Group Configurationに関する記述がありますが、これはRedshiftをVPC外部で利用する場合(Cluster Security Groupsを利用する場合)の話で、VPC内部で利用する場合(Cluster Subnet Groups)場合は関係のない話のようです。実際、私はVPC内部でRedshiftを起動したため特にCluster Security Groupsに変更はないようでした。 ↩